/*
 * Implementação dos métodos da classe Animation.
 */

#include <SDL/SDL_image.h>
#include <dirent.h>
#include "Animation.h"

using std::vector;
using std::string;
using utils::makeRect;


static inline vector<Sprite*> makeSprites(const string& path, SDL_Rect* base) {
	vector<Sprite*> sprites;
	struct dirent *dirp;

	DIR *dir = opendir(path.c_str());
	while ((dirp = readdir(dir)) != NULL) {
		if (dirp->d_name[0] != '.')
			sprites.push_back(new Sprite(path + "/" + dirp->d_name, base));
	}
	closedir(dir);
	return sprites;
}

/*
 * A utils.h vai criar o vetor de sprites pra gente. Inicializa tudo com zero,
 * exceto o tempo total e o H e W do retângulo de base.
 */
Animation::Animation(const string& path, unsigned stepDelay, SDL_Rect* base)  :
timeStep(stepDelay), timeTotal(1), timeNow(0),
index(0), angle(0.0), sprites(makeSprites(path, base)) {
	timeTotal = stepDelay * sprites.size();
}


/**
 * Libera todos os ponteiros para sprites.
 */
Animation::~Animation() {
	for (unsigned i = 0; i < sprites.size(); ++i) {
		delete sprites[i];
	}
}


/**
 * Ajusta o tempo total e o índice, verifica se precisa rotacionar a sprite ou
 * se ela já está no ângulo certo e centraliza ela usando o retângulo de base.
 */
Animation& Animation::update(int dt) {
	timeNow = (timeNow + dt) % timeTotal;
	index = timeNow / timeStep;
	if (sprites[index]->getAngle() != angle)
		sprites[index]->rotate(angle);
	return *this;
}


/**
 * Apenas renderiza a sprite certa.
 */
void Animation::render(SDL_Surface* screen) {
	sprites[index]->render(screen);
}
